package com.kanshu.service.impl;

import com.kanshu.constant.EnrollType;
import com.kanshu.constant.SignType;
import com.kanshu.model.User;
import com.kanshu.service.UserService;
import com.kanshu.utils.XmlReader;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * @author GAIst
 * ClassName UserServiceImpl.java
 * From
 * Description OK
 * createTime 2024年12月20日14:32:26
 */
public class UserServiceImpl implements UserService {
    private static EnrollType enrollType = new EnrollType();
    private static SignType signType = new SignType();
    /**
     * 处理用户登录请求
     *
     * @param user 尝试登录的用户对象，包含用户名和密码
     * @param users 存储所有用户信息的映射表，键为用户名，值为用户对象
     * @param out 用于向客户端发送响应数据的输出流
     */
    @Override
    public void handleLogin(User user, Map<String, User> users, ObjectOutputStream out) {
        // 初始化用户映射表
        users = new ConcurrentHashMap<>(10);
        // 从XML文件中加载用户数据
        users = XmlReader.loadUsersFromXml(enrollType.getXML_PATH(), users);

        // 根据用户名获取存储的用户信息
        User storedUser = users.get(user.getUsername());

        // 验证用户密码
        if (storedUser != null && storedUser.getPassword().equals(user.getPassword())) {
            // 登录成功，发送成功消息
            try {
                out.writeObject(signType.getOUTPUT_SUCCESS());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            // 用户名或密码错误，发送错误消息
            try {
                out.writeObject(signType.getOUTPUT_TEXT_FAILED());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 处理用户注册请求
     *
     * @param user 尝试注册的新用户对象
     * @param users 存储所有用户信息的映射表
     * @param out 用于向客户端发送响应的输出流
     */
    @Override
    public void handleEnroll(User user, Map<String, User> users, ObjectOutputStream out) {
        // 初始化用户映射表
        users = new ConcurrentHashMap<>(10);
        // 从XML文件中加载已有的用户数据
        users = XmlReader.loadUsersFromXml(enrollType.getXML_PATH(), users);

        // 检查是否有重复的用户名
        if (!users.containsKey(user.getUsername())) {
            // 如果用户名唯一，则将新用户添加到映射表中
            users.put(user.getUsername(), user);
            try {
                // 向客户端发送注册成功的消息
                out.writeObject(enrollType.getOUTPUT_USER_SAVESUCESS());
                // 将更新后的用户数据保存回XML文件
                XmlReader.saveUsersToXml(users, enrollType.getXML_PATH());
            } catch (IOException e) {
                // 异常处理：打印堆栈跟踪信息
                e.printStackTrace();
            }
        } else {
            try {
                // 如果用户名已存在，向客户端发送提示消息
                out.writeObject(enrollType.getOUTPUT_TEXT_USEREXIST());
            } catch (IOException e) {
                // 异常处理：打印堆栈跟踪信息
                e.printStackTrace();
            }
        }
    }
}
